实践中，通过用“代码”填充文件来编写C++程序，文件在ODR上下文中并不是特别重要，重要的是翻译单位。本质上，翻译单元是将预处理器应用于提供给编译器的文件的结果，预处理器删除没有通过条件编译指令(\#if，\#ifdef和友元)选择的代码段，删除注释，插入\#include的文件(递归)，并展开宏。

就ODR而言，以下两个文件

\begin{lstlisting}[style=styleCXX]
// header.hpp:
#ifdef DO_DEBUG
#define debug(x) std::cout << x << ’\n’
#else
#define debug(x)
#endif

void debugInit();

// myprog.cpp:
#include "header.hpp"
int main()
{
	debugInit();
	debug("main()");
}
\end{lstlisting}

等价于以下单个文件:

\begin{lstlisting}[style=styleCXX]
// myprog.cpp:
void debugInit();
int main()
{
	debugInit();
}
\end{lstlisting}

跨翻译单元的连接，是通过在两个翻译单元中具有相应的外部链接声明(例如，两个全局函数debugInit()的声明)来建立的。

翻译单元的概念比“预处理文件”更抽象一些。若将一个预处理文件两次提供给编译器以形成一个程序，编译器将把两个不同的翻译单元带入程序(然而，这样做没什么意义)。









































